perm filename HOD.MAC[1,3] blob
sn#054350 filedate 1973-07-20 generic text, type T, neo UTF8
TITLE HOD HEX-OCTAL-DECIMAL CONVERTER
SUBTTL KLOSSNER/A 18-JUL-73
VER=600101,,1 ;VERSION NUMBER
IFNDEF PURE,<PURE==0> ;ON FOR REENTRANT CODE
;ACS
PC= 11 ;PC FOR GETCHR SUBR
IB= 12 ;INPUT BASE
OB= 13 ;OUTPUT BASE
X= 14 ;INDEX REGISTER
W= 15 ;AC TO ASSEMBLE NUMBER
S= 16 ;SYMBOL WE'RE INPUTTING
P= 17 ;PDL AC
LOC 137 ;STORE VERSION NUMBER
EXP VER
RELOC
PAGE
SUBTTL START AND REQUEST BASES
IFG PURE,<TWOSEG ;MAKE IT REENTRANT
RELOC 400000>
HOD:: JFCL ;IN CASE OF CCL ENTRY
RESET ;OF COURSE
OUTSTR [ASCIZ !
HEX-OCTAL-DECIMAL CONVERTER. NEED HELP? !]
JSP PC,GETCHR ;SEE IF THE CHOADE IS HELPLESS
CAIN S,"Y" ;YES?
OUTSTR HELP ;YES, HELP HIM OUT
ASK: CLRBFI ;CLEAR TYPEAHEAD
OUTSTR [ASCIZ !
FROM !] ;REQUEST INPUT BASE
SETZ X, ;ZERO BASE REGISTER
JRST BIN ;GET BASE
H: MOVEI IB,↑D16 ;SIGNIFY HEX INPUT
JRST O+1
D: SKIPA IB,[TEN: ↑D10] ;DECIMAL...
O: MOVEI IB,10 ;...OR OCTAL
OUTSTR [ASCIZ ! TO !] ;GET OUTPUT BASE
MOVEI X,H2-H ;NEW INDEX
JRST BIN ;GET OUTPUT BASE
H2: MOVEI OB,↑D16 ;INDICATE HEX OUTPUT
JRST O2+1
D2: SKIPA OB,TEN
O2: MOVEI OB,10
PAGE
SUBTTL GET THE NUMBER
OUTSTR [ASCIZ !
#!] ;REQUEST NUMBER
SETZ W, ;ZERO RECEIVING WORD
JFCL 17,.+1 ;AND ALL FLAGS
LP: JSP PC,GETCHR ;GET DIGIT
CAIN S,"=" ;PUT IT NOW?
JRST EQUALS ;YES
CAIGE S,"0" ;LEGAL DIGIT?
JRST ACHK ;NO, GO CHECK ALPHABETIC DIGITS
CAILE S,"9"
JRST ACHK
MOVEI S,-"0"(S) ;CONVERT
JRST PUT ;AND GO PUT IT IN
ACHK: CAIGE S,"A" ;LEGAL HEX?
JRST BAD
CAILE S,"F"
JRST BAD
MOVEI S,-"A"+↑D10(S) ;CONVERT
JRST PUT ;AND ADD IT IN
BAD: OUTSTR [ASCIZ !
? BAD DIGIT
!]
JRST ASK ;BACK TO TRY AGAIN
PUT: CAIL S,(IB) ;OK DIGIT FOR THIS BASE?
JRST BAD ;NO
IMULI W,(IB) ;YES, MAKE ROOM FOR IT
ADDI W,(S) ;AND ADD IT IN
JOV .+2 ;OVERFLOW?
JRST LP ;NO, GET ANOTHER
OUTSTR [ASCIZ !
? TOO BIG
!] ;INDICATE OVERFLOW
JRST ASK ;TRY AGAIN
PAGE
SUBTTL OUTPUT THE NUMBER
EQUALS: MOVE P,[IOWD ↑D14,PDL];SET UP PDL POINTER
PUSH P,[0] ;END OF NUMBER INDICATOR
OIT: IDIVI W,(OB) ;GET A DIGIT
MOVEI S,"0"(S) ;CONVERT TO ASCII
CAILE S,"9" ;A-F?
MOVEI S,"A"-"9"-1(S) ;YES, ADD MORE
PUSH P,S ;PUSH IT
JUMPN W,OIT ;DO MORE DIGITS IF ANY
AO: POP P,S ;GET A DIGIT
JUMPE S,ASK ;DONE IF ZERO
OUTCHR S ;OUT IT
JRST AO ;BACK FOR MORE
PAGE
SUBTTL SUBROUTINES TO GET A BASE AND GET A CHARACTER IN UC
BIN: JSP PC,GETCHR ;GET THE LETTER
CAIN S,"H" ;HEX?
JRST [OUTSTR [ASCIZ !EX!];SAY "HEX"
JRST H(X)] ;LEAVE
CAIN S,"D" ;DECIMAL?
JRST [OUTSTR [ASCIZ !ECIMAL!]
JRST D(X)]
CAIN S,"O"
JRST [OUTSTR [ASCIZ !CTAL!]
JRST O(X)]
OUTSTR [ASCIZ !
? BAD BASE
!]
JRST ASK
GETCHR: INCHRW S ;GET A CHARACTER
CAIGE S,"A"+40 ;LETTER?
JRST (PC) ;NO, RETURN
CAIG S,"Z"+40 ;MAYBE...
MOVEI S,-40(S) ;YES, CONVERT TO UC
JRST (PC) ;RETURN
PAGE
SUBTTL DATA
LIT ;GET THE LITERALS
HELP: ASCIZ !
INSTRUCTIONS:
WHEN YOU SEE "FROM", TYPE O, D, OR H FOR OCTAL, DECIMAL,
OR HEX INPUT. DO NOT FOLLOW WITH A CARRIAGE RETURN. REPEAT
THIS PROCEDURE WHEN YOU SEE "TO" TO DETERMINE THE OUTPUT BASE.
TO THE NUMBER SIGN (#) TYPE THE NUMBER IN YOUR SELECTED INPUT
BASE. IN HEX MODE, LEGAL DIGITS ARE 0-9, A-F. AFTER THE NUMBER
TYPE AN EQUAL SIGN (=) AND THE NUMBER WILL BE OUTPUT IN YOUR
REQUESTED OUTPUT BASE. NUMBERS MAY NOT BE GREATER
THAN DECIMAL 2↑35-1, NOR LESS THAN 0.
!
IFG PURE,<RELOC 0> ;GO TO LO-SEG IF NOT ALREADY THERE
VAR ;GET VARIABLES IF ANY
PDL: BLOCK ↑D14 ;PUSHDOWN STACK
END HOD ;THAT'S IT . . .